﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class CodexManager
{
	public struct Entry
	{
		public string	titleToShow;	// 화면에 표시할 제목
		public int		index;			// 실제 리스트상의 인덱스
		public int		loopCount;		// 해당 메세지가 등장한 루프 회차수
	}


	// Constants

	const string		c_name_codexPointVar	= "codexpoint";
	const string		c_name_masterPassVar	= "masterpass";
	const string		c_name_clearCountVar	= "clearcount";
	const string		c_masterPass			= "";		// TODO : 대문자로



	// Members

	static bool			m_prefLoaded			= false;	// 설정값 로드 여부
	static int			m_currentCodexPoint		= -1;		// 현재까지 모은 보안 점수
	static bool			m_masterPass			= false;	// 마스터패스 통과 여부
	static int			m_clearCount			= 0;		// 클리어 횟수
	static List<Codex>	m_codexList				= new List<Codex>();



	/// <summary>
	/// 저장된 포인트 모두 리셋
	/// </summary>
	public static void ResetSavedPoints()
	{
		PlistReadWriter.SetInt(c_name_codexPointVar, 0);
		PlistReadWriter.SetBoolean(c_name_masterPassVar, false);

		m_currentCodexPoint	= 0;
		m_masterPass		= false;
	}


	/// <summary>
	/// 보안 포인트
	/// </summary>
	static public int codexPoint
	{
		get
		{
			LoadValues();

			return m_currentCodexPoint;
		}
		set
		{
			m_currentCodexPoint	= value;
			PlistReadWriter.SetInt(c_name_codexPointVar, value);
			
		}
	}

	/// <summary>
	/// 보안 레벨 (보안 포인트로 계산)
	/// </summary>
	static public int securityLevel
	{
		get
		{
			int level			= -1;
			int pointStep		= 10;
			int currentPoint	= 0;

			while (currentPoint < codexPoint)				// 현재 보안 포인트에 맞는 레벨을 계산
			{
				currentPoint	+= pointStep * (level + 2);
				level++;
			}

			return level < 0? 0 : level;
		}
	}

	/// <summary>
	/// 마스터 패스워드 통과 여부
	/// </summary>
	static public bool masterPass
	{
		get
		{
			LoadValues();
			return m_masterPass;
		}
		set
		{
			m_masterPass	= value;
			PlistReadWriter.SetBoolean(c_name_masterPassVar, value);
		}
	}

	/// <summary>
	/// 클리어 카운트
	/// </summary>
	static public int clearCount
	{
		get
		{
			LoadValues();
			return m_clearCount;
		}
		set
		{
			m_clearCount	= value;
			PlistReadWriter.SetInt(c_name_clearCountVar, value);
		}
	}

	static void LoadValues()
	{
		if (!m_prefLoaded)
		{
			m_currentCodexPoint	= PlistReadWriter.GetInt(c_name_codexPointVar);
			m_masterPass		= PlistReadWriter.GetBoolean(c_name_masterPassVar);
			m_clearCount		= PlistReadWriter.GetInt(c_name_clearCountVar);
			m_prefLoaded		= true;
		}
	}


	/// <summary>
	/// 암호문 리스트를 생성해서 리턴
	/// </summary>
	/// <returns></returns>
	public static Entry[] MakeCodexEntryList()
	{
		List<Entry> entries	= new List<Entry>();
		List<Entry> looping	= new List<Entry>();	// 루프마다 반복되는 코덱스 리스트
		int codexCount				= m_codexList.Count;
		int curLoop					= 1;
		int curSecurityLevel		= securityLevel;

		for(int i = 0; i < codexCount; i++)						// * 1회차용 루프
		{
			Codex codex				= m_codexList[i];
			Entry entry				= new Entry();
			entry.loopCount			= curLoop;
			entry.index				= i;

			bool secLevelOK			= codex.securityLevel <= curSecurityLevel;
			bool masterPassOK		= masterPass || !codex.needMasterPass;
			entry.titleToShow		= (secLevelOK && masterPassOK)? codex.title : "[접근 거부]";

			//entries.Add(entry);									// 리턴할 목록에 추가

			if (codex.isLooping)								// 루프되는 엔트리는 따로 모아둔다 (1회차때는 안보임)
				looping.Add(entry);
			else
				entries.Add(entry);								// 리턴할 목록에 추가
		}

		for (; curLoop < clearCount+1; )						// * 1회차 이후 루프
		{
			curLoop++;
			foreach (Entry origEntry in looping)
			{
				Entry entry	= new Entry();			// 회차수만 다르게 설정된 엔트리 생성
				entry.loopCount		= curLoop;
				entry.index			= origEntry.index;
				entry.titleToShow	= origEntry.titleToShow;

				entries.Add(entry);								// 리턴할 목록에 추가
			}
		}

		return entries.ToArray();
	}

	public static void AddCodex(Codex codex)
	{
		m_codexList.Add(codex);
	}

	public static Codex GetCodex(int index)
	{
		return m_codexList[index];
	}
}
